home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 February: Tool Chest / Dev.CD Feb 99 TC.toast / Tool Chest / Development Kits / MPW etc / Documentation / Debuggers / SADE / SADE 1.3.3 Release Notes / SADE 1.3.3 Release Notes
Encoding:
Text File  |  1997-03-24  |  81.2 KB  |  908 lines  |  [ONLN/HLX2]

  1. SADE 1.3.3
  2. Release Notes
  3. Copyright Apple Computer Inc.
  4. 1993. All rights reserved.
  5. Changes Since SADE 1.3.2
  6. n    SADE would occasionally fail while defining a certain number of user strings on systems with greater than 16MB of RAM.  This has now been fixed.
  7. n    Under certain low memory conditions, SADE may not have been able to retrieve correct type information.  This has now been fixed.
  8. Changes Since SADE 1.3.1
  9. n    SADE was handling trace exceptions generated by MacsBug.  While running SADE in the background, if you attempted to set an address break from MacsBug and then exe-cute “go,” SADE would take control.  This has now been fixed.
  10. Changes Since SADE 1.3
  11. n    BreakIf was failing under some situations. This has now been fixed.
  12. n    SADE was writing to NIL under low-memory conditions.  This has now been fixed.
  13. n    Increased “preferred” memory partition size to 1.5 megabytes to be able to handle MacApp without running out of memory.
  14. n    Stepping after hitting a one-instruction source statement would stop two source instructions later instead of at the next instruction.
  15. n    SADE now displays the correct CCR value in the registers window. 
  16. n    You can now set the values of the SR/CCR register.
  17. n    SADE no longer uses the MPW Shell’s small icon for the Notification Manager.
  18. n    SADE now works properly under VM on 040 machines.
  19. n    The Extras menu item Show Self has been separated into two items:
  20.     Show **this (Command-4), and
  21.     Show *this.
  22.     Show **this functions exactly as Show Self did in SADE 1.3 Final. However, for C++ programmers who are not using MacApp, the Show *this menu item is more useful. Therefore, we have included both.    
  23. Changes Since SADE 1.3B2
  24. n    CFront  generates incorrect symbols for any PascalObject with a forward declaration. In the member functions, CFront  says that this is a *TType, then casts all references through this to (**(TType**)this). To alleviate this problem some hacks were put in SADE.  If your program contains the resource %__MethTable (as is the case with MacApp programs), and if you have a type which the symbol file specifies to be a pointer to a PascalObject (a record whose first element is a __vtable), SADE will make itself believe that the type really is a pointer to a pointer to that object. As a con-sequence of this fix, if you singly dereference a handle to a PascalObject, the pointer value displayed will be correct, but the type displayed will be a handle.
  25.  
  26. The newly provided menu item  Twice Dereference Selection (Command-5), explained below, makes displaying objects through handles much easier.
  27. n    A new menu called Extras was added. Four of the menu items under this menu make displaying objects easier, and the last one makes changing the value of objects easier.
  28.     • Show Value In Context (Command-2) and
  29.     • Show Dereferenced Value In Context (Command-3) 
  30.      The old style Show Value menu items have no context, they simply follow scoping rules. Thus, if you select fNext, it will try to show you an automatic fNext, a global fNext, this^.fNext or this^^.fNext.
  31.     These new menu items put the value of the selected variable in a separate window.  For subsequent selections, the name of the window provides the context.  E.g. if you select fNext in your source file and do a Command-2, you will most likely get this^^.fNext.  However, if you had previously displayed a variable newWindow, and select fNext in that window, Command-2 will show you newWindow.fNext.
  32.  
  33. Since these windows are really files, when the length of the name of the thing to be displayed exceeds 32 characters, it will be displayed in the Value window instead. These menus do not work if your selection has a colon (:) in it. These commands are slightly slower than the regu-lar show value menu items, but having a separate window for each variable far outweighs the slight speed penalty.
  34.  
  35. • Set Value (Command-=)
  36. Changing variables has always been difficult in SADE . The problem is that SADE shows you structured values, but you probably need to change only a field in a struc-tured object. It would be nice to type over a displayed value in a window to the value you want.  Unfortunately, it is not that simple.
  37.     If you are trying to change a simple variable, simply highlight its name and select the menu item Set Value.  From the displayed dialog box, you can verify that SADE is going to change the variable you wanted. If the proper object is selected, type in the value you want.  You can type in expressions instead of simple numbers.  You can also type in the name of a complex object whose type matches that of the left hand side.
  38.  
  39. In implementing this operation, SADE first evaluates the left hand side, then evaluates the expression you typed in, and may display error messages if it finds any problems.  After that SADE will try the actual assignment; that too may fail because of incompati-ble types for the left and right hand sides.
  40.  
  41. To change a field buried in a structure, you have to peel the outer levels. E.g. if you want to change
  42.     FirstLevel.SecondLevel->Member
  43. do a Command-2 after selecting FirstLevel. This gives you a window named FirstLevel. In that window, select the word SecondLevel and do a Command-3. Now you have a window named FirstLevel.SecondLevel^. In this window select the text Member and select Set Value or Command-=.
  44.     Two new menu commands were added to the Extras  menu to make debugging MacApp applications written in C++ easier.
  45.     • The menu item Show Self (Command-4) displays **this in a separate window.
  46. You must be stopped inside a MacApp method for this menu to work.
  47.  
  48. C++ programmers who are not using MacApp may wish to edit the SADE routine __ShowSelf__ in the file SadeStartup file so that this menu displays *this instead.
  49.     • The menu item Twice Dereference Selection (Command-5) makes displaying objects through a handle to them a one step process. The value is displayed in a sepa-rate window, as in the previous commands.
  50.  
  51. This menu is implemented in the file SadeUserStartup•Extras.  You can remove this file without affecting SADE's behavior in any other way.
  52. n    The order in which SADE startup files are executed is:
  53.     • SadeStartup
  54.     • SadeUserStartup
  55.     • all files whose names starts with SadeUserStartup•. These files are executed in alpha-betical order.
  56.  
  57. If you want to override anything defined in the file SadeUserStartup•Extras, create a file named something like SadeUserStartup•zzz, so that it is alphabetically later.
  58. n    SADE will place all temporary files in the sub-folder called SADE Scratch inside the SADE launch directory.  If the folder does not exist, SADE will create it.  During exit, SADE will delete all SADE created files from this directory.
  59.  
  60. One side effect of this behavior is that SADE will no longer remember the position of the temporary windows like Values. If you prefer the old behavior, override the scratch directory by adding the following line to your SadeUserStartup file:
  61.     __ScratchDir__ := SADEDir
  62. n    When SADE needs to open a source file, it tries much harder now.  The symbol file provides SADE with either a full path name or just the leaf name, depending on the way the file was compiled. In addition, the modification date of the source file when it was last compiled is also provided. Here is the list of actions SADE goes through to find a source file:
  63.     • Check if any of the open files have the same leaf name and matching date. If not,
  64.     • If the symbol table specified a full path name, try the full path to open the file. If not,
  65.     • Try to find a file in the default directory with the same leaf name. If not,
  66.     • Try to find a file in any of the directories in the SourcePath. If not,
  67.     • Check if any of the open files have the same leaf name but a wrong date. If not,
  68.     • Ask the user to navigate the directory structure to find a file with the same leaf name.
  69.     Check the modification date of the file found in any of the above ways, if there is a mismatch, give the user a chance to find a better match. If the user finds a file in a new directory, add the new directory to the source path.
  70. n    If you open a source file in a directory which is not in the current source path, and try to set a break point in it, if SADE finds the symbol for a file with that name, SADE will add the new directory to the source path.
  71. n    When SADE displays a record, the name of the record is displayed in addition to its contents.  Occasionally SADE may display names like __O32, these are generated by CFront in situa-tions like anonymous unions or structs.
  72. n    When the conditional break table is full, we shift the oldest break point out instead of deleting all old conditional breakpoints. You still get the warning.
  73. Changes Since SADE 1.3B1
  74. n    SADE will now set the Sourcepath variable for you.  If SADE cannot find the applica-tion’s source files in the same directory as the symbol file, it will prompt you to find the source file.  In addition, while debugging your code, if you step into a procedure defined in a separate source file and that file is in a different directory than those de-fined by the sourcepath vari-able, SADE will prompt you to search for that file as well. SADE will add the new directory indicated to the sourcepath.
  75.     Note, however, that SADE does not clear the Sourcepath variable each time you kill your application. This way, you can continue targeting the same application without SADE prompting you each time to locate your source files.
  76. n    SC7 is a new script available in the SADE folder.  When executed from the worksheet, you may use the procedure StackCrawl7 or sc7 defined in the script to show a pos-sible calling chain sequence.  StackCrawl7 is similar to the MacsBug command sc7.  It is useful for dis-playing the calling sequence when the built in A6 based stack command does not work.
  77. n    MacsBug and ROM symbols will now be displayed in a disassembly. When there is no sym-bolic information available and your code has been compiled with MacsBug sym-bols, SADE will display MacsBug information, e.g.:
  78.         BEQ.S      µINITIALIZE+$00BA   ; 00BE7B22
  79. n    SADE will now display up to the first 20 elements of an array instead of just the first element.  
  80. n    When displaying the value of a pointer to a string, SADE will always display the pointer value, then the string if it meets the criteria described below.
  81. n    C does not have a built-in string type. The following heuristic is employed to determine if a signed or unsigned character array contains a string:
  82.     // Get past the printable characters
  83.     for (i = 1; i < len; i++)
  84.         if (!isgraph(string[i]) && !isspace(string[i]))
  85.             break;
  86.         
  87.     // Is this a CStr?  Must terminate with a null.
  88.     if (string[i] == 0)
  89.         // The first byte must be printable
  90.         if (isgraph(string[0]) || isspace(string[0]))
  91.             goto display_CStr;
  92.         
  93.     // Is this a PStr?  The string[length] byte must be printable
  94.     if (string[0] < i)
  95.         goto display_PStr;
  96.     The significance of this is that if you have partially constructed strings in a char array, SADE may decide you do not have a string. If string display fails, SADE will show you the first 20 elements of your array, which may give you a clue as to why the array did not display as a string.  One peculiar case is when the first element of your array contains a zero, in which case SADE will believe that it successfully displayed a null string, and will not show the rest of the array.  In most cases this is the right answer, but not always.
  97.     Also note that you can type coerce your array to display it as a PString:
  98.         ^PString(@YourArray)
  99.     Similarly,  you can coerce your array to display it as a CString:
  100.         ^CString(@YourArray)
  101.     Note that Pascal strings are shown with single quotes, e.g. 'string', whereas C style null-terminated strings are shown as "string".
  102. XCMDs, etc.
  103. n    SADE’s default behavior does not allow you to set breakpoints in resources which are not of the type 'CODE'.  You can change this behavior by setting the built-in SADE variable BreakInNonCODERsrc to 1. Be warned, however, that as SADE must then check every re-source which is being loaded into memory, this option will slow things down.
  104. n    You can debug HyperCard XCMDs and XFCNs with SADE. To be able to debug XCMDs, follow these steps. 
  105. (1)    Compile and link your XCMD (or XFCN ) with symbolics.
  106. (2)    Using ResEdit, remove the XCMD resource out of the original stack and paste it into the HyperCard application itself.
  107. (3)    In SADE, you must set the SADE variable BreakInNonCODERsrc to 1.  
  108. (4)    Set the directory to the location of the .SYM file and set the sourcepath to the loca-tion of your sources.  
  109. (5)    Next, target HyperCard using the SYM file, e.g.:
  110. Target "HD:HyperCard:Hypercard" using "HD:Examples:HyperXExample.SYM"
  111.     You will see an “Initial program break encountered at...” message output to the worksheet, which indicates HyperCard itself was suspended.  From here, you may open your source file, set a breakpoint and execute your program.
  112.     Note: this is not a fully supported feature of SADE.  Therefore, the above steps may not work in all instances.
  113. n    Some applications may load your XCMD-type code resources in a subheap. To be able to debug them, you need to set another built-in SADE variable, CurTargetZone, to the ad-dress of that subheap.
  114. n    Debugging printer drivers is analogous to debugging XCMDs and XFCNs.  Build the driver and paste the code resource you wish to debug into any application.  Remember to place the driver in the extensions folder (System 7.0) and select the driver from the Chooser.  Set the directory and sourcepath as mentioned above.  Set the variable BreakInNonCODERsrc to 1.  Target the application using the .SYM file you just cre-ated.  You may now set a break in your source file and execute the SADE command Go.
  115. Known bugs
  116. n    If you target an MPW tool and then before executing the tool from the MPW work-sheet, you set a break on the tool and quit SADE, the Shell may crash with a bus error. 
  117. n    If you step over the last statement in an MPW tool written in Pascal, you may get an address error in the Shell.
  118. n    The SADEKey may not work until the target application has made an event call (for instance, WaitNextEvent).
  119.     Pressing the SADEKey multiple times in a row may cause a crash.
  120.     Targeting a running application and then hitting the SADEKey may not work.
  121. n    The Stack command does not support the documented option at address.
  122. n    If the Stack command is part of a break action, the stack will not necessarily be dis-played when the breakpoint is encountered.  A Printf command following the stack command will flush internal buffers, forcing any pending output.
  123. n    SADE shows Pascal variables containing sets as integers, instead of showing the set elements with their names.
  124. n    If you kill the target using the menu command, the watch variables are removed and the conditional break table is cleared. However, if you use the SADE command Kill, or quit the target, these clean up actions are not done. If you target again, the old watch variables may not be relevant.
  125. n    There is a size limit of 1,006 bytes on the value which can be assigned to a SADE vari-able.  As a consequence of this, you can not use the Show Value menu to display a variable of size greater than 1,006 bytes.  You can, however, enter the name of the variable you want to display in a writable window and hit enter to get its value.
  126. n    Assigning a large C structure to a SADE variable in a define statement may display garbage as part of the error message.
  127. n    To reference Pascal variables declared at UNIT scope, when the PC is not in the scope of the unit, use the syntax, \UNITNAME.variablename. To reference Pascal variables declared at PROGRAM scope use the syntax, \variableName; referencing them as \PROGRAMNAME.variableName does not work.
  128. n    When running SADE on a Classic and targeting a MacApp program, once you step into a MacApp method, SADE can’t retrieve the symbol information for the source.
  129. n    If Stop Before Constructor is set and after targeting you step over main() in a C or C++ application, quitting the application will produce an error message of "Data Initialization Failed!". 
  130. n    Stepping over a CHK or TRAPV instruction which will cause an exception results in a crash.
  131. n    If you enter SADE by calling a SysError() call, the condition code registers displayed will be invalid.
  132. n    Since SADE allows users to use symbol files which may not have been produced as part of the application build, SADE can not do any checking of the symbol file date relative to the application date. If you see the error message:
  133.     Logical end-of-file reached during read operation (OS error -39)
  134. when you target a process, it probably means that your application and the symbol file are out of sync.
  135. n    The current symbolic information does not include information specific to classes. While SADE supports commands like Break Class TSomething, it requires SADE to scan the entire symbol file to find matching names.  As a result, this command can take a long time. 
  136. n    Similarly, the symbolic information does not include information about static class variables, and SADE does not display these when a class object is displayed. To see a class static vari-able, you have to fully qualify the name, e.g.
  137.     TClass:fgStaticField
  138. n    If you have trace points set within the main event loop of your target program, so that they are continually displayed in the worksheet, the target application's menu may oc-casionally overlap the SADE menu.  This is only a cosmetic problem in the Process Manager (System 7.0) and in Multifinder (System 6.0) and should not affect the func-tionality of your program.
  139. n    Users of Object Pascal who are not using MacApp should always specify the linker's method table optimization option -opt on. Otherwise, stepping over method calls will not work.  This is because SADE changes the return address of the method’s caller, which confuses the method dispatch procedure (%_Method).  When %_Method fails, it intentionally executes a division by zero, which is what SADE reports.
  140. n    SADE  cannot target background-only applications because of the way it works with the  Process Manager.  Workaround: Remove the background-only restriction from the applica-tion and debug.  Once your application is fully debugged, make it background-only again.
  141. System 7.0 specific bugs
  142. n    Under System 7.0, if you’ve targeted an application and stepped through your initial-ization code, even though your target is suspended, hiding SADE will cause the target to run.  This is a bug in the Process Manager.
  143. n    If a file is open modifiable from a shared volume by one user, that file cannot be opened (read-only) for targeting by another user. 
  144. n    Do not launch two debuggers at the same time.  If you quit the second one launched, and try any operation in the first one, you will get the cryptic message:
  145. #   Application made module calls in improper order  (OS error -603)
  146. System 6.0 specific bugs
  147. n    Special care needs to be taken when debugging MacApp programs under system 6.0.x.  After killing a program the first time, you may not be able to retarget the application and be forced to reboot.  This is because MacApp installs a VBL which is not being re-moved by MultiFinder after a kill.  This does not occur under system 7.0.  A work around is to always quit your application normally; do not kill the application from SADE.
  148. n    SADE doesn’t handle script execution properly when the script is in the same folder as the target.  Workaround: fully qualify the path to the script before executing it.
  149. n    There is a bug in Multifinder 6.1b9 which prevents you from being able to scroll the Apple Menu when the option key is held down.
  150. n    If you use the target command when you already have a suspended target, the old target will not be restarted.
  151. n    If you launch a target from SADE, and quit SADE without first killing it, when the tar-get quits, Multifinder will try to send a message to a non-existent process and cause a system crash.
  152. n    The SADEKey cannot be changed under System 6.0.
  153. n    SADE does not work with Maxima™ or Virtual (both from Connectix Corp.).
  154. Compiler and Linker symbol generation bugs:
  155. n    The compilers do not generate type information unless considered necessary.  If you have a type declared but do not have any object of that type, possibly used only for casting, no sym-bolics are generated for the type. Workaround: none. This is a compiler feature to minimize the symbol table size.
  156. n    CFront typically generates constructor and destructor code at the beginning and end of syn-tactic blocks, gives them separate symbolic information records, but maps them to the same location in the source file. One observed behavior is stepping multiple times on the same source statement. Also, in this situation if you do a Break followed by an Unbreak, the loca-tion you set the breakpoint and the location you did the unbreak may not be the same, even if the selection looks identical. Workaround: none.
  157. n    If the source code contains a series of declarations with assignments, CFront  produces incor-rect symbol information for these.  The observed behavior is that you need to single step as many times as there are declarations, but SADE keeps highlighting the first statement in the series.  After sufficient number of steps, SADE will jump over all the declaration code at once. Workaround: none.
  158. n    C++ allows variables to be declared anywhere within a block.  When a program is stopped in a block before a variable comes into scope, SADE will display an incorrect value for the vari-able. A better behavior might be to say that the variable is not in scope. 
  159. n    CFront  passes a temporary file C.pipe.code to the C compiler. The C compiler incor-rectly assigns all global static variables to the unit C. For this reason, references to static variables in a file other than the current one does not work as expected. Workaround: instead of \FileName.StaticName, try \C.StaticName.
  160. n    SADE can not print the values of anonymous unions in C++ correctly.  If you have:
  161. struct Outer {
  162.     int field;
  163.      union {  // anonymous
  164.         int cant_find;
  165.         char another_cant_find;
  166.     };
  167. } Outer_thing;
  168.     SADE is unable to display the value of Outer_thing.cant_find.  Workaround: If you look at the struct that CFront makes, you will see a name like __O1 for the anony-mous union.  If you say Outer_thing.__O1.cant_find then SADE will print it. 
  169. n    The  MPW 3.2 C compiler produces incorrect source statement information for state-ments with zero effect. The symptom is SADE's inability to set breakpoints in some routines. These show up most commonly in the process of compiling the output of CFront. Workaround: give -opt off flag to the compiler.
  170. n    Both the MPW 3.2 C and Pascal compilers may assign multiple user variables to the same register. As a consequence, if you try to display a register variable whose value is currently dead, the value displayed may be wrong. Workaround: none.
  171. n    If an enclosed Pascal procedure does not use any variable from the calling procedure, the MPW 3.2 Pascal compiler optimizes away the static link, but does not reflect this in the symbol information, resulting in incorrect display of arguments in the called func-tion. Workaround: use -opt on, nostatic or the -opt off flags to the Pascal compiler.
  172. n    The MPW 3.2 Pascal compiler optimizes away the LINK instruction for functions which do not need stack storage for local variables, resulting in incorrect display of the stack. Workaround: give -opt off flag to the Pascal compiler.
  173. n    The MPW 3.2 Pascal compiler generates incorrect symbol information about the loca-tion of local variables that are assigned to a FPU register . Workaround: none.
  174. n    The MPW 3.2 Pascal compiler generates incorrect symbol information for enclosed functions with a procedure parameter. Workaround: none.
  175. n    If your program contains single-statement for loops which should execute multiple times, SADE will appear to step through the loop only once.  This is due to the way that both the MPW 3.2 C and Pascal compilers generate symbol information. Workaround: set a break-point on the statement in the for loop and execute the Go command multiple times.
  176. n    The MPW C and Pascal compilers occasionally generate incorrect symbol information for statement boundaries. Workaround: give -opt off flag to the compiler.
  177. n    The current symbolic structure is somewhat limited in the size of the program that can be compiled with symbolics. The following table lists the number of different symbolic items a symbol file can contain.
  178. Indexes to source statements (CSNTE)    4 G lines        
  179. Number of different source files    2K        
  180. Number of Functions (MTE)    64K        
  181. Number of blocks (CMTE)    64K        
  182. Number of Variables and Constants (CVTE)    64K        
  183. Number of Types (TINFO)    64K        
  184. Number of Labels (CLTE)    64K        
  185. n    Even if you stay within the above limits, the MPW 3.2 linker occasionally produces incorrect type information in large symbol tables. The Show Value menu item(s) nor-mally traps all internal errors and displays the message Undefined/Out of scope. However, if you type the name of the object in the worksheet and hit enter, SADE may then print the error message:
  186. Symbol table error: Variable type table index could not be found. 
  187.  
  188. Workaround:  The post 3.2 version of the linker shipped on the E.T.O. #5 disk fixes most of these problems. If you still find this problem, and if your program uses a rich hierarchy of classes, there is no workaround.  Even with a partially broken symbol file, you may be able to do most of the things you need to do. If your program is just big, if the size of your symbol table exceeds 1 megabyte, consider compiling parts of your application without symbols, and compile only the suspect parts with symbols.
  189.  
  190. You can use the SADE diagnostic command List Symbol to see the local variables and types that are defined in the current scope. This command will also show if any symbolic informa-tion associated with these objects is inconsistent.
  191. n    Types which have global scope sometimes get  bound to a local scope, you can see the type definition only if the type is used in the current scope, or a containing scope. Workaround: none.
  192. SADE 1.3 Manual Errata
  193. n    The manual’s index was not generated correctly, so you may notice that each entry (after page 42) is off by two pages. Simply subtract the entry by 2 to get the correct page number.
  194. n    The dialog box displayed when the target menu is selected is shown as a generic SFGetFile dialog box. In the released product  the dialog box contains the line
  195.     Please select an application or symbol file. 
  196. n    In the section describing the different ways to target a program,  the manual states that you can drag and drop the icon of the target application on top of the SADE icon. For this feature to work, you may need to rebuild your desktop once.  
  197. n    The Target menu command as described in the manual is incomplete.  It states that you must select an application to debug, when in fact you may choose either an application or its .SYM file from the dialog box.  Then, if both files are not in the same directory, SADE will prompt you to locate the missing file. For instance, if you select a symbol file, e.g. AppName.SYM.,  and the application file is not in the same directory, SADE will put up a dialog asking you to locate the file AppName.  (Your application and .SYM file names do not have to be the same, however.)
  198. n    The manual states that if your target program is suspended and you quit SADE, SADE will terminate the program. SADE will now restart your target application if it can.
  199. n    The description of the Show Stack menu command is incomplete.  The command now displays a warning if the program counter points to a LINK instruction.
  200. n    The Disasm command correlates source statement numbers with assembly code instructions. Branch instructions which use the new branch island option, are shown with a ^ character to denote the indirection.
  201. n    The intentional bug introduced in the third C tutorial program, Sample2, can be more destructive than we intended. Running this program can cause your machine to hang.
  202.  
  203. If it does not hang your system, and you display the stack when the bus error occurs, the output is more informative than documented, in that SADE displays some MacsBug symbols.
  204. n    SADE acquired the ability to prompt for source files when needed after the manual was finalized.  As a consequence you may never have to use the SourcePath command.  This behavior is not documented in the SADE manual, but is described in some detail at the beginning of these release notes. 
  205. n    SADE now includes an optional menu called Extras which is not documented in the manual, but is described earlier in these release notes. 
  206.     Contrary to what the SADE 1.3 Manual states, you can debug Hypercard XCMDs and XFCNs with SADE. The procedure for doing this is described earlier in these release notes. 
  207. `◊#ˇ ˇˇˇˇ#◊ 
  208. _,Times
  209. .°dONLNd)<=ù+ZW
  210. SADE 1.3.3°dONLNd ?êS+T
  211. Release Notes
  212. °dONLNdè<õΩ(∑ZCopyright Apple Computer Inc.°dONLNd7ö<¶¢* 1993. All rights reserved.
  213. °dONLNdRfl<ÔÚ*HChanges Since SADE 1.3.2 ÙXÙ,
  214.  
  215. Zapf Dingbats
  216. 
  217. °dONLNdk<
  218. A*!n
  219. °dONLNdmJΔ)OSADE would occasionally fail while defining a certain number of user strings on°dONLNdΩJè*@systems with greater than 16MB of RAM.  This has now been fixed.
  220. °dONLNd˛+<1A(OZn
  221. °dONLNd'J3≈)LUnder certain low memory conditions, SADE may not have been able to retrieve°dONLNdM5JA=*3correct type information.  This has now been fixed.
  222. °dONLNdÅ{<ãÚ(¶ZChanges Since SADE 1.3.1 êXê
  223. 
  224. °dONLNdö£<©A*!n
  225. °dONLNdúüJ´‚)OSADE was handling trace exceptions generated by MacsBug.  While running SADE in°dONLNdÏ≠Jπ‹*Rthe background, if you attempted to set an address break from MacsBug and then exe°dONLNd>≠‹π‡(’˙-°dONLNd?ªJ«x(„h=cute “go,” SADE would take control.  This has now been fixed.
  226. °dONLNd}<'Á(BZChanges Since SADE 1.3 ,X,
  227. 
  228. °dONLNdî?<EA*!n,
  229. Courier
  230. °dONLNdñ;JGz)BreakIf 
  231. °dONLNdû;zGó)0;was failing under some situations. This has now been fixed.
  232. °dONLNd⁄U<[A(yZn
  233. °dONLNd‹QJ]⁄)NSADE was writing to NIL under low-memory conditions.  This has now been fixed.
  234. °dONLNd+k<qA(èZn
  235. °dONLNd-gJs )QIncreased “preferred” memory partition size to 1.5 megabytes to be able to handle°dONLNduJÅ*%MacApp without running out of memory.
  236. °dONLNd•è<ïA(≥Zn
  237. °dONLNdßãJóø)OStepping after hitting a one-instruction source statement would stop two source(·Z
  238. SADE 1.3.3)“1)aE.T.O. #14 Release Notesˇ4◊#ˇ ˇˇˇˇ#◊ 
  239. _,Times
  240. .°dONLNd)J55+hQ6instructions later instead of at the next instruction.,
  241.  
  242. Zapf Dingbats
  243. °dONLNd7C<IA(gZn
  244. °dONLNd9?JKã)@SADE now displays the correct CCR value in the registers window.
  245. °dONLNd{Y<_A(}Zn
  246. °dONLNd}UJa@)2You can now set the values of the SR/CCR register.
  247. °dONLNd∞o<uA(ìZn
  248. °dONLNd≤kJwƒ)LSADE no longer uses the MPW Shell’s small icon for the Notification Manager.
  249. °dONLNdˇÖ<ãA(©Zn
  250. °dONLNdÅJçV)1SADE now works properly under VM on 040 machines.
  251. °dONLNd3õ<°A(øZn
  252. °dONLNd5óJ£_)The ,
  253. Courier
  254. °dONLNd9ó_£É)Extras
  255. °dONLNd?óÉ£∫)$  menu item 
  256. °dONLNdJó∫£)7    Show Self
  257. °dONLNdSó£î)6# has been separated into two items:
  258. °dONLNdx•`±ñ(Õ~ Show **this 
  259. °dONLNdÑ•ñ±Ò)6(Command-4), and
  260. °dONLNdñ¥`¿ë(‹~ Show *this.°dONLNd£…J’å(Òh Show **this
  261. °dONLNdÆ…å’Ô)B functions exactly as 
  262. °dONLNdƒ…Ô’%)c    Show Self
  263. °dONLNdÕ…%’⁄)6$ did in SADE 1.3 Final. However, for°dONLNdÚ◊J„=(ˇh.C++ programmers who are not using MacApp, the 
  264. °dONLNd ◊=„y)Û
  265. Show *this
  266. °dONLNd*◊y„”)< menu item is more°dONLNd=ÂJÒ(
  267. h)useful. Therefore, we have included both.
  268. °dONLNdh+<;˙(VZChanges Since SADE 1.3B2 @X@
  269. 
  270. °dONLNdÅS<YA*!n
  271. °dONLNdÉOJ[‹)TCFront  generates incorrect symbols for any PascalObject with a forward declaration.°dONLNdÿ]Ji*+In the member functions, CFront  says that 
  272. °dONLNd]i0)Œthis
  273. °dONLNd]0iF) is a 
  274. °dONLNd
  275. ]Fij)*TType
  276. °dONLNd]ji‡)$, then casts all references°dONLNd/kJwr(ìhthrough 
  277. °dONLNd7krwä)(this
  278. °dONLNd;käwô) to 
  279. °dONLNd?kôwˇ)(**(TType**)this)
  280. °dONLNdPkˇw‡)f/. To alleviate this problem some hacks were put°dONLNdÄyJÖ3(°h0in SADE.  If your program contains the resource 
  281. °dONLNd∞y3Ö{)È %__MethTable
  282. °dONLNdºy{Ö◊)H (as is the case with°dONLNd“áJìÃ(ØhPMacApp programs), and if you have a type which the symbol file specifies to be a°dONLNd#ïJ°`*=pointer to a PascalObject (a record whose first element is a 
  283. °dONLNd`ï`°ê(Ω~__vtable
  284. °dONLNdhïê°Œ)0 ), SADE will°dONLNdu£JØÿ(Àh[make itself believe that the type really is a pointer to a pointer to that object. As a con°dONLNd–£ÿØ‹(Àˆ-°dONLNd—±JΩÿ(ŸhWsequence of this fix, if you singly dereference a handle to a PascalObject, the pointer°dONLNd)øJÀò*Ivalue displayed will be correct, but the type displayed will be a handle.°dONLNdt€JÁ„*The newly provided menu item  
  285. °dONLNd퀄Á”)ô(Twice Dereference Selection (Command-5),
  286. °dONLNdªÈJı¢(hFexplained below, makes displaying objects through handles much easier.
  287. °dONLNd<    A('Zn
  288. °dONLNdˇJ ß)A new menu called 
  289. °dONLNdˇß À)]Extras
  290. °dONLNdˇÀ ‡)$7 was added. Four of the menu items under this menu make°dONLNdT
  291. J‹(5hWdisplaying objects easier, and the last one makes changing the value of objects easier.°dONLNd≠#J/Q*• 
  292. °dONLNdØ#Q/)!Show Value In Context (Command-2)
  293. °dONLNd–#/+)Δ and°dONLNd÷9JEQ(ah• 
  294. °dONLNdÿ9QEe).Show Dereferenced Value In Context (Command-3)°dONLNdO<[B(wZ 
  295. °dONLNd
  296. OJ[“)OThe old style Show Value menu items have no context, they simply follow scoping°dONLNdZ]Ji√*rules. Thus, if you select 
  297. °dONLNdu]√i·)yfNext
  298. °dONLNdz]·ií)', it will try to show you an automatic 
  299. °dONLNd°]íi∞)±fNext
  300. °dONLNd¶]∞i‹)
  301. , a global
  302. °dONLNd±kJwn(ìhfNext,
  303. °dONLNd∑knwq)$ 
  304. °dONLNd∏kqwπ) this^.fNext 
  305. °dONLNdƒkπw√)Hor
  306. °dONLNdΔk√w)
  307.  
  308.  this^^.fNext
  309. °dONLNd”kw)N.°dONLNd÷ÅJçÂ(©hVThese new menu items put the value of the selected variable in a separate window.  For°dONLNd-èJõÊ*Wsubsequent selections, the name of the window provides the context.  E.g. if you select(·Z
  310. SADE 1.3.3)“2)aE.T.O. #14 Release Notesˇä◊#ˇ ˇˇˇˇ#◊ 
  311. _,
  312. Courier
  313. .°dONLNd)J5h+hQfNext,Times
  314. °dONLNd)h5Ô) in your source file and do a 
  315. °dONLNd#)Ô5%)á    Command-2
  316. °dONLNd,)%5õ)6, you will most likely get
  317. °dONLNdG7JCí(_h this^^.fNext
  318. °dONLNdS7íCó)H7.  However, if you had previously displayed a variable 
  319. °dONLNdä7óCÕ(_µ    newWindow
  320. °dONLNdì7ÕCÂ)6, and°dONLNdôEJQg(mhselect 
  321. °dONLNd†EgQÖ)fNext
  322. °dONLNd•EÖQ[)) in that window, Command-2 will show you 
  323. °dONLNdŒE[Qµ)÷newWindow.fNext
  324. °dONLNd›EµQπ)Z.°dONLNd‡aJm“(âhTSince these windows are really files, when the length of the name of the thing to be°dONLNd5oJ{Õ*Rdisplayed exceeds 32 characters, it will be displayed in the Value window instead.°dONLNdà}JâŸ*SThese menus do not work if your selection has a colon (:) in it. These commands are°dONLNd‹ãJó–*slightly slower than the regu°dONLNd˙ã–ó‚)Ü7lar show value menu items, but having a separate window°dONLNd2ôJ•Q(¡h9for each variable far outweighs the slight speed penalty.°dONLNdmµJ¡Q*• 
  325. °dONLNdoµQ¡œ)Set Value (Command-=)
  326. °dONLNdÖ√Jœ–(ÎhOChanging variables has always been difficult in SADE . The problem is that SADE°dONLNd’—J›ÿ*Tshows you structured values, but you probably need to change only a field in a struc°dONLNd)—ÿ›‹(˘ˆ-°dONLNd*flJÎ⁄(hVtured object. It would be nice to type over a displayed value in a window to the value°dONLNdÅÌJ˘&*0you want.  Unfortunately, it is not that simple.°dONLNd≥JŸ*WIf you are trying to change a simple variable, simply highlight its name and select the°dONLNd J~*
  327. menu item 
  328. °dONLNd~¥)4    Set Value
  329. °dONLNd¥Ÿ)6=.  From the displayed dialog box, you can verify that SADE is°dONLNd\J+‘(GhVgoing to change the variable you wanted. If the proper object is selected, type in the°dONLNd≥-J9Á*Uvalue you want.  You can type in expressions instead of simple numbers.  You can also°dONLNd    ;JG–*Stype in the name of a complex object whose type matches that of the left hand side.°dONLNd^WJcfl*WIn implementing this operation, SADE first evaluates the left hand side, then evaluates°dONLNd∂eJqfl*Uthe expression you typed in, and may display error messages if it finds any problems.°dONLNd
  330. sJ€*VAfter that SADE will try the actual assignment; that too may fail because of incompati°dONLNdcs€fl(õ˘-°dONLNddÅJç(©h,ble types for the left and right hand sides.°dONLNdíùJ©’*WTo change a field buried in a structure, you have to peel the outer levels. E.g. if you°dONLNdÍ´J∑ë*want to change
  331. °dONLNd˙∫`Δ+FirstLevel.SecondLevel->Member
  332. °dONLNd«J”a(Ôhdo a 
  333. °dONLNd«a”ó)    Command-2
  334. °dONLNd'«ó”Ø)6: after selecting FirstLevel. This gives you a window named
  335. °dONLNdb’J·Ü(˝h
  336. FirstLevel
  337. °dONLNdl’Ü·&)<". In that window, select the word 
  338. °dONLNdé’&·h)† SecondLevel
  339. °dONLNdô’h·ñ)B
  340.  and do a 
  341. °dONLNd£’ñ·Ã).    Command-3
  342. °dONLNd¨’÷–)6.°dONLNdÆ„JÔÁ( hNow you have a window named 
  343. °dONLNd „ÁÔq)ùFirstLevel.SecondLevel^
  344. °dONLNd·„qÔ›)ä. In this window select°dONLNd˘ÒJ˝o(h    the text 
  345. °dONLNdÒo˝ì)%Member
  346. °dONLNdÒì˝)$ and select Set Value or 
  347. °dONLNd!Ò˝:)q    Command-=
  348. °dONLNd*Ò:˝>)6.°dONLNd-J#(/h(Two new menu commands were added to the 
  349. °dONLNdU#G)ŸExtras
  350. °dONLNd[Gƒ)$  menu to make debugging°dONLNdtJ!(=h*MacApp applications written in C++ easier.°dONLNd†+J7ö*• The menu item 
  351. °dONLNd∞+ö7)PShow Self (Command-4) 
  352. °dONLNdΔ+7H)Ñ    displays 
  353. °dONLNdœ+H7l)***this
  354. °dONLNd’+l7◊)$ in a separate window.°dONLNdÏ9JEî(ahAYou must be stopped inside a MacApp method for this menu to work.°dONLNd    /UJaÃ*JC++ programmers who are not using MacApp may wish to edit the SADE routine
  355. °dONLNd    zcJoí* __ShowSelf__
  356. °dONLNd    Ücíoè)H9 in the file SadeStartup file so that this menu displays 
  357. °dONLNd    øcèo≥)˝*this 
  358. °dONLNd    ≈c≥oÿ)$instead.°dONLNd    œyJÖö(°h• The menu item 
  359. °dONLNd    flyöÖä)P(Twice Dereference Selection (Command-5) 
  360. °dONLNd
  361. yäÖ‹)makes displaying°dONLNd
  362. áJìÿ(ØhUobjects through a handle to them a one step process. The value is displayed in a sepa°dONLNd
  363. máÿì‹(؈-(·Z
  364. SADE 1.3.3)“3)aE.T.O. #14 Release NotesˇV◊#ˇ ˇˇˇˇ#◊ 
  365. _,Times
  366. .°dONLNd)J5+hQ)rate window, as in the previous commands.°dONLNd+EJQÁ*VThis menu is implemented in the file SadeUserStartup•Extras.  You can remove this file°dONLNdÇSJ_F*3without affecting SADE's behavior in any other way.,
  367.  
  368. Zapf Dingbats
  369. °dONLNd∂m<sA(ëZn
  370. °dONLNd∏iJuJ)6The order in which SADE startup files are executed is:°dONLNdJãN*•
  371. °dONLNdÒÉNâP) 
  372. °dONLNdÚPãâ) SadeStartup°dONLNdˇïJ°N(Ωh•
  373. °dONLNdôNüP) 
  374. °dONLNdïP°†)SadeUserStartup°dONLNd´J∑N(”h•
  375. °dONLNdØNµP) 
  376. °dONLNd´P∑fl)Uall files whose names starts with SadeUserStartup•. These files are executed in alpha°dONLNdi´fl∑„(”˝-°dONLNdjπJ≈à(·hbetical order.°dONLNdz›JÈ◊*$UIf you want to override anything defined in the file SadeUserStartup•Extras, create a°dONLNd–ÎJ˜¡*Rfile named something like SadeUserStartup•zzz, so that it is alphabetically later.
  377. °dONLNd#< A()Zn
  378. °dONLNd%J
  379. b)=SADE will place all temporary files in the sub-folder called ,
  380. Courier
  381. °dONLNdbb
  382. ™()Ä SADE Scratch
  383. °dONLNdn™
  384. ⁄)H  inside the°dONLNdzJ·(7hXSADE launch directory.  If the folder does not exist, SADE will create it.  During exit,°dONLNd”J)d*<SADE will delete all SADE created files from this directory.°dONLNd9JE€*UOne side effect of this behavior is that SADE will no longer remember the position of°dONLNdgGJSÊ*Wthe temporary windows like Values. If you prefer the old behavior, override the scratch°dONLNdøUJa$*/directory by adding the following line to your 
  385. °dONLNdÓU$a~)⁄SadeUserStartup
  386. °dONLNd˝U~aì)Z file:
  387. °dONLNdd`pˆ(å~__ScratchDir__ := SADEDir
  388. °dONLNd}<ÉA(°Zn
  389. °dONLNd!yJÖ’)QWhen SADE needs to open a source file, it tries much harder now.  The symbol file°dONLNdsáJì—*Rprovides SADE with either a full path name or just the leaf name, depending on the°dONLNdΔïJ°‡*Xway the file was compiled. In addition, the modification date of the source file when it°dONLNd£JØ÷*Twas last compiled is also provided. Here is the list of actions SADE goes through to°dONLNdt±JΩú*find a source file:°dONLNdâ«J”Œ*S• Check if any of the open files have the same leaf name and matching date. If not,°dONLNdfi›JÈ·*]• If the symbol table specified a full path name, try the full path to open the file. If not,°dONLNd=ÛJˇ§*N• Try to find a file in the default directory with the same leaf name. If not,°dONLNdç    Jã*I• Try to find a file in any of the directories in the SourcePath. If not,°dONLNdÿJ+»*R• Check if any of the open files have the same leaf name but a wrong date. If not,°dONLNd,5JA‡*Z• Ask the user to navigate the directory structure to find a file with the same leaf name.°dONLNdàKJW–*UCheck the modification date of the file found in any of the above ways, if there is a°dONLNdfiYJe‚*Zmismatch, give the user a chance to find a better match. If the user finds a file in a new°dONLNd9gJs;*4directory, add the new directory to the source path.
  390. °dONLNdnÅ<áA(•Zn
  391. °dONLNdp}Jâ›)YIf you open a source file in a directory which is not in the current source path, and try°dONLNd ãJóÊ*Yto set a break point in it, if SADE finds the symbol for a file with that name, SADE will(·Z
  392. SADE 1.3.3)“4)aE.T.O. #14 Release Notesˇ
  393. Æ◊#ˇ ˇˇˇˇ#◊ 
  394. _,Times
  395. .°dONLNd)J5
  396. +hQ)add the new directory to the source path.,
  397.  
  398. Zapf Dingbats
  399. °dONLNd*C<IA(gZn
  400. °dONLNd,?JK‘)SWhen SADE displays a record, the name of the record is displayed in addition to its°dONLNdÄMJYL*4contents.  Occasionally SADE may display names like ,
  401. Courier
  402. °dONLNd¥MLYj(uj__O32
  403. °dONLNdπMjYŸ), these are generated by°dONLNd“[Jgë(ÉhCFront in situa°dONLNd‚[ëgL)G'tions like anonymous unions or structs.
  404. °dONLNd
  405. u<{A(ôZn
  406. °dONLNd qJ}⁄)XWhen the conditional break table is full, we shift the oldest break point out instead of°dONLNdeJã*Ddeleting all old conditional breakpoints. You still get the warning.
  407. °dONLNd™≈<’˙(ZChanges Since SADE 1.3B1 ⁄X⁄
  408. 
  409. °dONLNd√Ì<ÛA*!n
  410. °dONLNd≈ÈJı‹)SSADE will now set the Sourcepath variable for you.  If SADE cannot find the applica°dONLNdÈ‹ı‡(˙-°dONLNd˜J◊(hXtion’s source files in the same directory as the symbol file, it will prompt you to find°dONLNdrJŸ*Vthe source file.  In addition, while debugging your code, if you step into a procedure°dONLNd…J–*Ydefined in a separate source file and that file is in a different directory than those de°dONLNd"–‘(;Ó-°dONLNd#!J-Õ(Ihfined by the sourcepath vari°dONLNd@!Õ-‡)É;able, SADE will prompt you to search for that file as well.°dONLNd|/J;j(Wh<SADE will add the new directory indicated to the sourcepath.°dONLNd∫EJQ’*RNote, however, that SADE does not clear the Sourcepath variable each time you kill°dONLNd
  411. SJ_’*Syour application. This way, you can continue targeting the same application without°dONLNdaaJm`*9SADE prompting you each time to locate your source files.
  412. °dONLNdõ{<ÅA(üZn
  413. °dONLNdùwJɉ)TSC7 is a new script available in the SADE folder.  When executed from the worksheet,°dONLNdÚÖJëÃ*you may use the procedure 
  414. °dONLNd ÖÃë)Ç StackCrawl7
  415. °dONLNdÖë)B or 
  416. °dONLNdÖë6)sc7 
  417. °dONLNdÖ6ëÿ)#defined in the script to show a pos°dONLNdBÖÿë‹)¢-°dONLNdCìJü„(ªhUsible calling chain sequence.  StackCrawl7 is similar to the MacsBug command sc7.  It°dONLNdô°J≠î*is useful for dis°dONLNd´°î≠Â)JEplaying the calling sequence when the built in A6 based stack command°dONLNdÒØJªí(◊hdoes not work.
  418. °dONLNd…<œA(ÌZn
  419. °dONLNd≈J—Ê)PMacsBug and ROM symbols will now be displayed in a disassembly. When there is no°dONLNdS”Jfl^*sym°dONLNdW”^fl⁄)Lbolic information available and your code has been compiled with MacsBug sym°dONLNd£”⁄flfi(˚¯-°dONLNd§·JÌD(    h2bols, SADE will display MacsBug information, e.g.:°dONLNdŸ˜`E+)BEQ.S      µINITIALIZE+$00BA   ; 00BE7B22
  420. °dONLNd<A(5Zn
  421. °dONLNd
  422. JŸ)WSADE will now display up to the first 20 elements of an array instead of just the first°dONLNd]J'r*element.(·Z
  423. SADE 1.3.3)“5)aE.T.O. #14 Release Notesˇ æ◊#ˇ ˇˇˇˇ#◊ 
  424. _,
  425.  
  426. Zapf Dingbats
  427. .°dONLNd-<3A+ZQn,Times
  428. °dONLNd)J5Δ)PWhen displaying the value of a pointer to a string, SADE will always display the°dONLNdS7JCä*Hpointer value, then the string if it meets the criteria described below.
  429. °dONLNdúQ<WA(uZn
  430. °dONLNdûMJYÊ)XC does not have a built-in string type. The following heuristic is employed to determine°dONLNd˜[JgQ*:if a signed or unsigned character array contains a string:,
  431. Courier
  432. °dONLNd3j`v8+$// Get past the printable characters°dONLNdYx`ш*for (i = 1; i < len; i++)°dONLNduÜÑíû+$/if (!isgraph(string[i]) && !isspace(string[i]))°dONLNd®î®†Ã+$break;°dONLNd≥∞`ºz(ÿ~/// Is this a CStr?  Must terminate with a null.°dONLNd‰æ` “*if (string[i] == 0)°dONLNd˙ÃÑÿV+$#// The first byte must be printable°dONLNd ⁄ÑÊí*-if (isgraph(string[0]) || isspace(string[0]))°dONLNdQË®Ù+$goto display_CStr;°dONLNdh`Œ(,~=// Is this a PStr?  The string[length] byte must be printable°dONLNdß`Ã*if (string[0] < i)°dONLNdº Ñ,+$goto display_PStr;
  433. °dONLNd–5JAfi(]h[The significance of this is that if you have partially constructed strings in a char array,°dONLNd,CJO’*QSADE may decide you do not have a string. If string display fails, SADE will show°dONLNd~QJ]·*Vyou the first 20 elements of your array, which may give you a clue as to why the array°dONLNd’_Jk÷*Wdid not display as a string.  One peculiar case is when the first element of your array°dONLNd-mJyÿ*Vcontains a zero, in which case SADE will believe that it successfully displayed a null°dONLNdÑ{Já€*Ystring, and will not show the rest of the array.  In most cases this is the right answer,°dONLNdfiâJïì*but not always.°dONLNdÔüJ´ò*IAlso note that you can type coerce your array to display it as a PString:
  434. °dONLNd;∂`¬ÿ+^PString(@YourArray)
  435. °dONLNdQÀJ◊s(ÛhASimilarly,  you can coerce your array to display it as a CString:
  436. °dONLNdï‚`Óÿ+^CString(@YourArray)
  437. °dONLNd´˜Jc(h<Note that Pascal strings are shown with single quotes, e.g. 
  438. °dONLNdÁ˜cì(Å'string'
  439. °dONLNdÔ˜ìÂ)0, whereas C style°dONLNdJ¯(-h%null-terminated strings are shown as 
  440. °dONLNd&¯()Æ"string"
  441. °dONLNd.(,)0.
  442. °dONLNd0K<[í(vZ XCMDs, etc. `X`
  443. 
  444. °dONLNd<s<yA*!n
  445. °dONLNd>oJ{‡)TSADE’s default behavior does not allow you to set breakpoints in resources which are°dONLNdì}Jâ’*Rnot of the type 'CODE'.  You can change this behavior by setting the built-in SADE°dONLNdÊãJór*    variable 
  446. °dONLNdÔãrófi)(BreakInNonCODERsrc
  447. °dONLNdãfió‘)l1 to 1. Be warned, however, that as SADE must then(·Z
  448. SADE 1.3.3)“6)aE.T.O. #14 Release Notesˇp◊#ˇ ˇˇˇˇ#◊ 
  449. _,Times
  450. .°dONLNd)J5é+hQcheck every re°dONLNd)é5fi)DFsource which is being loaded into memory, this option will slow things°dONLNdV7JCi(_hdown.,
  451.  
  452. Zapf Dingbats
  453. °dONLNd\Q<WA(uZn
  454. °dONLNd^MJYŒ)FYou can debug HyperCard XCMDs and XFCNs with SADE. To be able to debug°dONLNd•[Jg“*XCMDs, follow these steps.°dONLNd¡iNu\+(1)°dONLNd≈iiuÑ)Compile and link your XCMD (or XFCN ) with symbolics.°dONLNd˚wNÉ\(ül(2)°dONLNdˇwiɵ)Using ResEdit, °dONLNdwµÉfi)Lremove°dONLNdwfiÉ·))6 the XCMD resource out of the original stack and paste°dONLNdKÖië!(≠á)it into the HyperCard application itself.°dONLNduìNü\(ªl(3)°dONLNdyìiüΩ)@In SADE, you must set the SADE variable BreakInNonCODERsrc to 1.°dONLNdº°N≠\(…l(4)°dONLNd¿°i≠”)PSet the directory to the location of the .SYM file and set the sourcepath to the°dONLNdØiª|*loca°dONLNdØ|ªfl)tion of your sources.°dONLNd.ΩN…\(Âl(5)°dONLNd2Ωi…R)Next, target HyperCard using the SYM file, e.g.:,
  455. Courier
  456. °dONLNdcÃ`ÿ>(Ù~%Target "HD:HyperCard:Hypercard" using°dONLNdâ⁄`Ê*"HD:Examples:HyperXExample.SYM"
  457. °dONLNd™ıifi+    OYou will see an “Initial program break encountered at...” message output to the°dONLNd˙i€*Jworksheet, which indicates HyperCard itself was suspended.  From here, you°dONLNdEi∑*Emay open your source file, set a breakpoint and execute your program.°dONLNdå'J3◊(OhTNote: this is not a fully supported feature of SADE.  Therefore, the above steps may°dONLNd·5JA¡*not work in all instances.
  458. °dONLNd¸O<UA(sZn
  459. °dONLNd˛KJW‰)QSome applications may load your XCMD-type code resources in a subheap. To be able°dONLNdPYJev*?to debug them, you need to set another built-in SADE variable, 
  460. °dONLNdèYveƒ(Åî
  461. CurTargetZone
  462. °dONLNdúYƒeÂ)N, to the°dONLNd•gJsU(èhad°dONLNd®gUsΩ) dress of that subheap.
  463. °dONLNdøÅ<áA(•Zn
  464. °dONLNd¡}Jâ‡)ODebugging printer drivers is analogous to debugging XCMDs and XFCNs.  Build the°dONLNdãJó·*Tdriver and paste the code resource you wish to debug into any application.  Remember°dONLNdfôJ•‹*Xto place the driver in the extensions folder (System 7.0) and select the driver from the°dONLNdøßJ≥≈*PChooser.  Set the directory and sourcepath as mentioned above.  Set the variable
  465. °dONLNdµJ¡∂*BreakInNonCODERsrc
  466. °dONLNd"µ∂¡‘)l? to 1.  Target the application using the .SYM file you just cre°dONLNdaµ‘¡ÿ(›Ú-°dONLNdb√Jœ’(ÎhOated.  You may now set a break in your source file and execute the SADE command
  467. °dONLNd≤—J›V*Go
  468. °dONLNd¥—V›Z) .
  469. °dONLNd∂<'í(BZ
  470. Known bugs ,X,
  471. 
  472. °dONLNd¡?<EA*!n
  473. °dONLNd√;JGŒ)NIf you target an MPW tool and then before executing the tool from the MPW work°dONLNd;ŒG“(cÏ-°dONLNdIJU‰(qhWsheet, you set a break on the tool and quit SADE, the Shell may crash with a bus error.
  474. °dONLNdkc<iA(áZn
  475. °dONLNdm_Jk÷)TIf you step over the last statement in an MPW tool written in Pascal, you may get an°dONLNd¬mJyƒ*address error in the Shell.
  476. °dONLNdfiá<çA(´Zn
  477. °dONLNd‡ÉJè”)QThe SADEKey may not work until the target application has made an event call (for(·Z
  478. SADE 1.3.3)“7)aE.T.O. #14 Release Notesˇh◊#ˇ ˇˇˇˇ#◊ 
  479. _,Times
  480. .°dONLNd)J5«+hQinstance, WaitNextEvent).°dONLNd?JKÑ*?Pressing the SADEKey multiple times in a row may cause a crash.°dONLNd\UJa∏*JTargeting a running application and then hitting the SADEKey may not work.,
  481.  
  482. Zapf Dingbats
  483. °dONLNdßo<uA(ìZn
  484. °dONLNd©kJw_)The ,
  485. Courier
  486. °dONLNd≠k_wÉ)Stack 
  487. °dONLNd≥kÉwt)$/command does not support the documented option 
  488. °dONLNd‚ktwÜ)Òat 
  489. °dONLNdÂkÜwÆ)address.
  490. °dONLNdÓÖ<ãA(©Zn
  491. °dONLNdÅJçf)If the 
  492. °dONLNd˜Åfçä)Stack 
  493. °dONLNd˝Åäç÷)$Hcommand is part of a break action, the stack will not necessarily be dis°dONLNdEÅ÷ç⁄(©Ù-°dONLNdFèJõ—(∑hPplayed when the breakpoint is encountered.  A Printf command following the stack°dONLNdóùJ©~*@command will flush internal buffers, forcing any pending output.
  494. °dONLNdÿ∑<ΩA(€Zn
  495. °dONLNd⁄≥Jøÿ)SSADE shows Pascal variables containing sets as integers, instead of showing the set°dONLNd.¡JÕ»*elements with their names.
  496. °dONLNdI€<·A(ˇZn
  497. °dONLNdK◊J„Ê)VIf you kill the target using the menu command, the watch variables are removed and the°dONLNd¢ÂJÒ≤*Iconditional break table is cleared. However, if you use the SADE command °dONLNdΉ≤Œ(
  498. –Kill°dONLNdÔÂŒÒfl), or°dONLNdÙÛJˇ◊(hXquit the target, these clean up actions are not done. If you target again, the old watch°dONLNdMJ
  499. ◊*variables may not be relevant.
  500. °dONLNdl<!A(?Zn
  501. °dONLNdnJ#‡)VThere is a size limit of 1,006 bytes on the value which can be assigned to a SADE vari°dONLNdƒ‡#‰(?˛-°dONLNd≈%J1—(MhQable.  As a consequence of this, you can not use the Show Value menu to display a°dONLNd3J?–*Svariable of size greater than 1,006 bytes.  You can, however, enter the name of the°dONLNdkAJMæ*Qvariable you want to display in a writable window and hit enter to get its value.
  502. °dONLNdΩ[<aA(Zn
  503. °dONLNdøWJcG)6Assigning a large C structure to a SADE variable in a 
  504. °dONLNdıWGck)˝define
  505. °dONLNd˚Wkc÷)$ statement may display°dONLNdeJq¯(çh%garbage as part of the error message.
  506. °dONLNd8<ÖA(£Zn
  507. °dONLNd:{Já‚)UTo reference Pascal variables declared at UNIT scope, when the PC is not in the scope°dONLNdêâJïÀ*of the unit, use the syntax, 
  508. °dONLNd≠âÀï—)Å\
  509. °dONLNdÆâ—ï)UNITNAME
  510. °dONLNd∂âï)?.
  511. °dONLNd∑âïT) variablename°dONLNd√âTï‰)>. To reference Pascal variables°dONLNd„óJ£$(øh*declared at PROGRAM scope use the syntax, 
  512. °dONLNd
  513. ó$£*)⁄\
  514. °dONLNdó*£k) variableName°dONLNdók£Õ)A; referencing them as
  515. °dONLNd0•J±P(Õh\
  516. °dONLNd1•P±¨) PROGRAMNAME
  517. °dONLNd<•¨±≤)\.
  518. °dONLNd=•≤±Û) variableName°dONLNdI•Û±>)A does not work.
  519. °dONLNdYø<≈A(„Zn
  520. °dONLNd[ªJ«Ê)QWhen running SADE on a Classic and targeting a MacApp program, once you step into°dONLNd≠…J’æ*Ka MacApp method, SADE can’t retrieve the symbol information for the source.
  521. °dONLNd˘„<ÈA(Zn
  522. °dONLNd˚flJÎÊ)XIf Stop Before Constructor is set and after targeting you step over main() in a C or C++°dONLNdTÌJ˘Á*[application, quitting the application will produce an error message of "Data Initialization°dONLNd∞˚Jt*    Failed!".
  523. °dONLNdª<A(9Zn
  524. °dONLNdΩJ‚)SStepping over a CHK or TRAPV instruction which will cause an exception results in a°dONLNdJ+g*crash.
  525. °dONLNd9<?A(]Zn
  526. °dONLNd5JA‹)VIf you enter SADE by calling a SysError() call, the condition code registers displayed°dONLNdqCJOë*will be invalid.
  527. °dONLNdÇ]<cA(ÅZn
  528. °dONLNdÑYJe÷)OSince SADE allows users to use symbol files which may not have been produced as°dONLNd‘gJs—*Spart of the application build, SADE can not do any checking of the symbol file date°dONLNd    (uJÅd*?relative to the application date. If you see the error message:
  529. °dONLNd    iÑ`ê‡+@Logical end-of-file reached during read operation (OS error -39)
  530. (·Z
  531. SADE 1.3.3)“8)aE.T.O. #14 Release Notesˇÿ◊#ˇ ˇˇˇˇ#◊ 
  532. _,Times
  533. .°dONLNd)J5‡+hQVwhen you target a process, it probably means that your application and the symbol file°dONLNdW7JCî*are out of sync.,
  534.  
  535. Zapf Dingbats
  536. °dONLNdhQ<WA(uZn
  537. °dONLNdjMJYÕ)RThe current symbolic information does not include information specific to classes.°dONLNdΩ[Jg*"While SADE supports commands like ,
  538. Courier
  539. °dONLNdfl[gH)∂ Break Class °dONLNdÎ[HgÑ)H
  540. TSomething
  541. °dONLNdı[ÑgÁ)<, it requires SADE to°dONLNd iJu‰(ëhWscan the entire symbol file to find matching names.  As a result, this command can take°dONLNdcwJÉÇ* a long time.
  542. °dONLNdqë<óA(µZn
  543. °dONLNdsçJôŒ)SSimilarly, the symbolic information does not include information about static class°dONLNd«õJßfl*Uvariables, and SADE does not display these when a class object is displayed. To see a°dONLNd©Jµë*class static vari°dONLNd/©ëµf)G.able, you have to fully qualify the name, e.g.
  544. °dONLNd_∏`ƒÿ(‡~TClass:fgStaticField
  545. °dONLNdt—<◊A(ıZn
  546. °dONLNdvÕJŸ›)WIf you have trace points set within the main event loop of your target program, so that°dONLNdŒ€JÁ⁄*Uthey are continually displayed in the worksheet, the target application's menu may oc°dONLNd#€⁄Áfi(¯-°dONLNd$ÈJı”(hQcasionally overlap the SADE menu.  This is only a cosmetic problem in the Process°dONLNdv˜J‹*SManager (System 7.0) and in Multifinder (System 6.0) and should not affect the func°dONLNd…˜‹‡(˙-°dONLNd J≈(-htionality of your program.
  547. °dONLNdÂ<%A(CZn
  548. °dONLNdÁJ'‹)RUsers of Object Pascal who are not using MacApp should always specify the linker's°dONLNd:)J5Á*!method table optimization option 
  549. °dONLNd[)Á5)ù-opt on
  550. °dONLNdb)5‚)*,. Otherwise, stepping over method calls will°dONLNdè7JC’(_hRnot work.  This is because SADE changes the return address of the method’s caller,°dONLNd‚EJQÁ*Qwhich confuses the method dispatch procedure (%_Method).  When %_Method fails, it°dONLNd4SJ_ò*Fintentionally executes a division by zero, which is what SADE reports.
  551. °dONLNd{m<sA(ëZn
  552. °dONLNd}iJuÿ)QSADE  cannot target background-only applications because of the way it works with°dONLNdœwJɉ*Rthe  Process Manager.  Workaround: Remove the background-only restriction from the°dONLNd"ÖJëk*applica°dONLNd*Ökë€)!Ltion and debug.  Once your application is fully debugged, make it background°dONLNdvÖ€ëfl(≠˘-°dONLNdwìJü(ªh only again.
  553. °dONLNdÉ«<‘¡(ZSystem 7.0 specific bugs ‚X‚
  554. 
  555. °dONLNdúÍ<A*n
  556. °dONLNdûÊJÚÿ)TUnder System 7.0, if you’ve targeted an application and stepped through your initial°dONLNdÚÊÿÚ‹(ˆ-°dONLNdÛÙJfl(hUization code, even though your target is suspended, hiding SADE will cause the target°dONLNdIJ"*.to run.  This is a bug in the Process Manager.
  557. °dONLNdx<"A(@Zn
  558. °dONLNdzJ$ƒ)RIf a file is open modifiable from a shared volume by one user, that file cannot be°dONLNdÕ&J21*1opened (read-only) for targeting by another user.
  559. °dONLNd@<FA(dZn
  560. °dONLNd<JHŸ)SDo not launch two debuggers at the same time.  If you quit the second one launched,°dONLNdVJJVñ*Iand try any operation in the first one, you will get the cryptic message:
  561. °dONLNd†YJe‚*D#   Application made module calls in improper order  (OS error -603)
  562. (·Z
  563. SADE 1.3.3)“9)aE.T.O. #14 Release Notesˇ$◊#ˇ ˇˇˇˇ#◊ 
  564. _,Times
  565. .°dONLNd)<6¡+ZRSystem 6.0 specific bugs DXD,
  566.  
  567. Zapf Dingbats
  568. 
  569. °dONLNdM<SA*n
  570. °dONLNdIJUÊ)QSpecial care needs to be taken when debugging MacApp programs under system 6.0.x.°dONLNdnWJcÁ*[After killing a program the first time, you may not be able to retarget the application and°dONLNd eJqÃ*Qbe forced to reboot.  This is because MacApp installs a VBL which is not being re°dONLNdeÃq–(çÍ-°dONLNdsJ–(õhQmoved by MultiFinder after a kill.  This does not occur under system 7.0.  A work°dONLNdnÅJçŒ*Taround is to always quit your application normally; do not kill the application from°dONLNd√èJõl*SADE.
  571. °dONLNd…©<ØA(ÕZn
  572. °dONLNdÀ•J±‚)VSADE doesn’t handle script execution properly when the script is in the same folder as°dONLNd"≥Jøª*Rthe target.  Workaround: fully qualify the path to the script before executing it.
  573. °dONLNduÕ<”A(ÒZn
  574. °dONLNdw…J’◊)TThere is a bug in Multifinder 6.1b9 which prevents you from being able to scroll the°dONLNdÃ◊J„+*,Apple Menu when the option key is held down.
  575. °dONLNd˘Ò<˜A(Zn
  576. °dONLNd˚ÌJ˘Á)VIf you use the target command when you already have a suspended target, the old target°dONLNdR˚J´*will not be restarted.
  577. °dONLNdi<A(9Zn
  578. °dONLNdkJfl)VIf you launch a target from SADE, and quit SADE without first killing it, when the tar°dONLNd¡fl„(9˝-°dONLNd¬J+‹(GhWget quits, Multifinder will try to send a message to a non-existent process and cause a°dONLNd-J9ã*
  579. system crash.
  580. °dONLNd(G<MA(kZn
  581. °dONLNd*CJOF)/The SADEKey cannot be changed under System 6.0.
  582. °dONLNdZ]<cA(ÅZn
  583. °dONLNd\YJeª)GSADE does not work with Maxima™ or Virtual (both from Connectix Corp.).
  584. °dONLNd§ç<ö?(∂Z+Compiler and Linker symbol generation bugs: ®X®
  585. 
  586. °dONLNd–∞<∂A*n
  587. °dONLNd“¨J∏ÿ)SThe compilers do not generate type information unless considered necessary.  If you°dONLNd&∫JΔ—*Thave a type declared but do not have any object of that type, possibly used only for°dONLNd{»J‘ï*casting, no sym°dONLNdã»ï‘Ê)KGbolics are generated for the type. Workaround: none. This is a compiler°dONLNd”÷J‚
  588. (˛h*feature to minimize the symbol table size.
  589. °dONLNd˛<ˆA(Zn
  590. °dONLNdÏJ¯‡)VCFront typically generates constructor and destructor code at the beginning and end of°dONLNdW˙J[*syn°dONLNd[˙[fi)Qtactic blocks, gives them separate symbolic information records, but maps them to°dONLNd≠J€(0hVthe same location in the source file. One observed behavior is stepping multiple times°dONLNdJ"fi*Von the same source statement. Also, in this situation if you do a Break followed by an°dONLNd[$J0û*Unbreak, the loca°dONLNdm$û0‡)TDtion you set the breakpoint and the location you did the unbreak may°dONLNd≤2J>¢(ZhInot be the same, even if the selection looks identical. Workaround: none.
  591. °dONLNd¸L<RA(pZn
  592. °dONLNd˛HJTÂ)WIf the source code contains a series of declarations with assignments, CFront  produces°dONLNdVVJbb*incor°dONLNd\VbbŒ)Mrect symbol information for these.  The observed behavior is that you need to°dONLNd™dJp◊(åhTsingle step as many times as there are declarations, but SADE keeps highlighting the°dONLNdˇrJ~‚*Yfirst statement in the series.  After sufficient number of steps, SADE will jump over all°dONLNd    YÄJå/*/the declaration code at once. Workaround: none.(·Z
  593. SADE 1.3.3)Ã10)gE.T.O. #14 Release Notesˇd◊#ˇ ˇˇˇˇ#◊ 
  594. _,
  595.  
  596. Zapf Dingbats
  597. .°dONLNd-<3A+ZQn,Times
  598. °dONLNd)J5Œ)OC++ allows variables to be declared anywhere within a block.  When a program is°dONLNdR7JCfi*Ustopped in a block before a variable comes into scope, SADE will display an incorrect°dONLNd®EJQö*value for the vari°dONLNdªEöQΔ)PCable. A better behavior might be to say that the variable is not in°dONLNdˇSJ_i({hscope.
  599. °dONLNdm<sA(ëZn
  600. °dONLNd    iJu·) CFront  passes a temporary file ,
  601. Courier
  602. °dONLNd)i·u#)ó C.pipe.code
  603. °dONLNd4i#u‚)B( to the C compiler. The C compiler incor°dONLNd\i‚uÊ)ø-°dONLNd]wJÉ5(üh7rectly assigns all global static variables to the unit 
  604. °dONLNdîw5É;)ÎC
  605. °dONLNdïw;ÉÁ)'. For this reason, references to static°dONLNdΩÖJë€(≠hUvariables in a file other than the current one does not work as expected. Workaround:°dONLNdìJü~* instead of \
  606. °dONLNdì~ü)4FileName.StaticName
  607. °dONLNd2ìü)r, try 
  608. °dONLNd8ìüU)
  609. \C.StaticName
  610. °dONLNdEìUüY)N.
  611. °dONLNdG≠<≥A(—Zn
  612. °dONLNdI©Jµ÷)QSADE can not print the values of anonymous unions in C++ correctly.  If you have:
  613. °dONLNdõµR¡¶+ struct Outer {°dONLNd´¿`Ãú+
  614. int field;°dONLNd∂ÀR◊X(Ûp °dONLNd∏À`◊fi)union {  // anonymous°dONLNd–÷Ñ‚ÿ+$ int cant_find;°dONLNd··ÑÌ* char another_cant_find;°dONLNd˙Ï`¯l(~};°dONLNd˝˜R¶(p} Outer_thing;
  615. °dONLNd
  616.  J(4h'SADE is unable to display the value of 
  617. °dONLNd4 Å)πOuter_thing.cant_find
  618. °dONLNdI Å’)~.  Workaround: If°dONLNd[J&Ç(BhCyou look at the struct that CFront makes, you will see a name like 
  619. °dONLNdûÇ&ö(B†__O1
  620. °dONLNd¢ö&‹) for the anony°dONLNd∞‹&‡)B-°dONLNd±(J4ø(Phmous union.  If you say 
  621. °dONLNd…(ø4[)uOuter_thing.__O1.cant_find
  622. °dONLNd„([4Œ)ú then SADE will print it.
  623. °dONLNd˛B<HA(fZn
  624. °dONLNd>JJ÷)QThe  MPW 3.2 C compiler produces incorrect source statement information for state°dONLNdQ>÷J⁄(fÙ-°dONLNdRLJX÷(thRments with zero effect. The symptom is SADE's inability to set breakpoints in some°dONLNd•ZJf–*Oroutines. These show up most commonly in the process of compiling the output of°dONLNdıhJtÃ*CFront. Workaround: give 
  625. °dONLNdhÃt)Ç    -opt off 
  626. °dONLNdhta)6flag to the compiler.
  627. °dONLNd-Ç<àA(¶Zn
  628. °dONLNd/~Jä◊)QBoth the MPW 3.2 C and Pascal compilers may assign multiple user variables to the°dONLNdÅåJòÊ*Ysame register. As a consequence, if you try to display a register variable whose value is°dONLNd€öJ¶ô*Ccurrently dead, the value displayed may be wrong. Workaround: none.
  629. °dONLNd¥<∫A(ÿZn
  630. °dONLNd!∞Jº‹)UIf an enclosed Pascal procedure does not use any variable from the calling procedure,°dONLNdwæJ Â*Xthe MPW 3.2 Pascal compiler optimizes away the static link, but does not reflect this in°dONLNd–ÃJÿŸ*Vthe symbol information, resulting in incorrect display of arguments in the called func°dONLNd&ßÿ›(Ù˜-°dONLNd'⁄JÊ∏(htion. Workaround: use 
  631. °dONLNd=⁄∏ÊË)n-opt on,
  632. °dONLNdE⁄ËÊÎ)0 
  633. °dONLNdF⁄ÎÊ)nostatic
  634. °dONLNdN⁄Ê<)0 or the 
  635. °dONLNdV⁄<Êr)!    -opt off 
  636. °dONLNd_⁄rÊ«)6flags to the Pascal°dONLNdsËJÙw(h    compiler.
  637. °dONLNd}<A(&Zn
  638. °dONLNd˛J
  639. ;)/The MPW 3.2 Pascal compiler optimizes away the 
  640. °dONLNdÆ˛;
  641. S)ÒLINK
  642. °dONLNd≤˛S
  643. ») instruction for functions°dONLNdÕ J„(4hZwhich do not need stack storage for local variables, resulting in incorrect display of the°dONLNd(J&¬*stack. Workaround: give 
  644. °dONLNd@¬&¯)x    -opt off 
  645. °dONLNdI¯&x)6flag to the Pascal compiler.
  646. °dONLNdf4<:A(XZn
  647. °dONLNdh0J<⁄)QThe MPW 3.2 Pascal compiler generates incorrect symbol information about the loca°dONLNdπ0⁄<fi(X¯-°dONLNd∫>JJª(fhOtion of local variables that are assigned to a FPU register . Workaround: none.
  648. °dONLNd    
  649. X<^A(|Zn
  650. °dONLNd     TJ`”)OThe MPW 3.2 Pascal compiler generates incorrect symbol information for enclosed°dONLNd    \bJn]*7functions with a procedure parameter. Workaround: none.
  651. °dONLNd    î|<ÇA(†Zn
  652. °dONLNd    ñxJÑ)*If your program contains single-statement 
  653. °dONLNd    ¿xÑ$)»for
  654. °dONLNd    √x$Ñ”)$ loops which should execute multiple°dONLNd    ËÜJí’(ÆhStimes, SADE will appear to step through the loop only once.  This is due to the way(·Z
  655. SADE 1.3.3)Ã11)gE.T.O. #14 Release Notesˇ“◊#ˇ ˇˇˇˇ#◊ 
  656. _,Times
  657. .°dONLNd)J5µ+hQIthat both the MPW 3.2 C and Pascal compilers generate symbol information.°dONLNdJ7JCæ*Workaround: set a break°dONLNdb7æCE)tpoint on the statement in the ,
  658. Courier
  659. °dONLNdÄ7ECW)áfor
  660. °dONLNdÉ7WCΩ) loop and execute the 
  661. °dONLNdô7ΩC…)fGo
  662. °dONLNdúEJQ¡(mhcommand multiple times.,
  663.  
  664. Zapf Dingbats
  665. °dONLNd¥_<eA(ÉZn
  666. °dONLNd∂[Jgfl)QThe MPW C and Pascal compilers occasionally generate incorrect symbol information°dONLNdiJu*+for statement boundaries. Workaround: give 
  667. °dONLNd3iuT)‘    -opt off 
  668. °dONLNd<iTu≥)6flag to the compiler.
  669. °dONLNdRÉ<âA(ßZn
  670. °dONLNdTJã›)VThe current symbolic structure is somewhat limited in the size of the program that can°dONLNd´çJôÂ*Vbe compiled with symbolics. The following table lists the number of different symbolic°dONLNdõJßfl* items a symbol file can contain.°dONLNd#±NΩ+$Indexes to source statements (CSNTE)°dONLNdH±<Ωg)Ó    4 G lines°dONLNdT«N”Ê(Ôl Number of different source files°dONLNdu«<”K)Ó2K°dONLNdz›NÈ◊(lNumber of Functions (MTE)°dONLNdî›<ÈQ)Ó64K°dONLNdöÛNˇœ(lNumber of blocks (CMTE)°dONLNd≤Û<ˇQ)Ó64K°dONLNd∏    N (1l(Number of Variables and Constants (CVTE)°dONLNd·    <Q)Ó64K°dONLNdÁN+–(GlNumber of Types (TINFO)°dONLNdˇ<+Q)Ó64K°dONLNd5NAÃ(]lNumber of Labels (CLTE)°dONLNd5<AQ)Ó64K
  671. °dONLNd#O<UA(sZn
  672. °dONLNd%KJW’)REven if you stay within the above limits, the MPW 3.2 linker occasionally produces°dONLNdxYJeJ*7incorrect type information in large symbol tables. The 
  673. °dONLNdØYJeÜ(Åh
  674. Show Value
  675. °dONLNdπYÜe⁄)< menu item(s) nor°dONLNd Y⁄efi)T-°dONLNdÀgJsN(èh9mally traps all internal errors and displays the message 
  676. °dONLNdgNs“(èlUndefined/Out of scope
  677. °dONLNdg“s÷)Ñ.°dONLNduJʼn(ùhTHowever, if you type the name of the object in the worksheet and hit enter, SADE may°dONLNdqÉJè–*then print the error message:
  678. °dONLNdèíJû–*ASymbol table error: Variable type table index could not be found.
  679. °dONLNd”≠Jπ⁄*SWorkaround:  The post 3.2 version of the linker shipped on the E.T.O. #5 disk fixes°dONLNd'ªJ«fl*Wmost of these problems. If you still find this problem, and if your program uses a rich°dONLNd…J’Á*Xhierarchy of classes, there is no workaround.  Even with a partially broken symbol file,°dONLNdÿ◊J„Â*Xyou may be able to do most of the things you need to do. If your program is just big, if°dONLNd1ÂJÒ‘*Rthe size of your symbol table exceeds 1 megabyte, consider compiling parts of your°dONLNdÑÛJˇø*Mapplication without symbols, and compile only the suspect parts with symbols.°dONLNd”J*(You can use the SADE diagnostic command 
  680. °dONLNd˚_)” List Symbol
  681. °dONLNd_‘)B to see the local variables°dONLNd"J)‘(EhSand types that are defined in the current scope. This command will also show if any°dONLNdv+J7ù*symbolic informa°dONLNdá+ù7É)S3tion associated with these objects is inconsistent.
  682. °dONLNdªE<KA(iZn
  683. °dONLNdΩAJM‚)TTypes which have global scope sometimes get  bound to a local scope, you can see the°dONLNdOJ[ *Utype definition only if the type is used in the current scope, or a containing scope.°dONLNdh]Jiß*Workaround: none.(·Z
  684. SADE 1.3.3)Ã12)gE.T.O. #14 Release Notesˇ:◊#ˇ ˇˇˇˇ#◊ 
  685. _,Times
  686. .°dONLNd)<9Í+ZTSADE 1.3 Manual Errata >X>,
  687.  
  688. Zapf Dingbats
  689. 
  690. °dONLNdS<YA*#n
  691. °dONLNdOJ[œ)QThe manual’s index was not generated correctly, so you may notice that each entry°dONLNdk]Ji”*V(after page 42) is off by two pages. Simply subtract the entry by 2 to get the correct°dONLNd¬kJwã* page number.
  692. °dONLNdœÖ<ãA(©Zn
  693. °dONLNd—ÅJçƒ)OThe dialog box displayed when the target menu is selected is shown as a generic°dONLNd!èJõ∫*OSFGetFile dialog box. In the released product  the dialog box contains the line,
  694. Courier
  695. °dONLNdrù`©b++Please select an application or symbol file
  696. °dONLNdùùb©f(≈Ä.
  697. °dONLNd†∑<ΩA(€Zn
  698. °dONLNd¢≥Jøfl)YIn the section describing the different ways to target a program,  the manual states that°dONLNd¸¡JÕ‹*Uyou can drag and drop the icon of the target application on top of the SADE icon. For°dONLNdRœJ€}*@this feature to work, you may need to rebuild your desktop once.
  699. °dONLNdïÈ<ÔA(
  700. Zn
  701. °dONLNdóÂJÒ‚)UThe Target menu command as described in the manual is incomplete.  It states that you°dONLNdÌÛJˇ‡*Vmust select an application to debug, when in fact you may choose either an application°dONLNdDJ
  702. fl*Yor its .SYM file from the dialog box.  Then, if both files are not in the same directory,°dONLNdûJ€*USADE will prompt you to locate the missing file. For instance, if you select a symbol°dONLNdÙJ)v* file, e.g. °dONLNdˇv)√), AppName.SYM°dONLNd
  703. √)‚)M?.,  and the application file is not in the same directory, SADE°dONLNdJ+J7,(Sh3will put up a dialog asking you to locate the file °dONLNd}+,7\)‚AppName°dONLNdÑ+\7Ã)0.  (Your application and°dONLNdù9JER(ah5.SYM file names do not have to be the same, however.)
  704. °dONLNd”S<YA(wZn
  705. °dONLNd’OJ[·)RThe manual states that if your target program is suspended and you quit SADE, SADE°dONLNd(]JiŒ*Twill terminate the program. SADE will now restart your target application if it can.
  706. °dONLNd}w<}A(õZn
  707. °dONLNdsJ¥)The description of the 
  708. °dONLNdñs¥)j
  709. Show Stack
  710. °dONLNd†s‰)<- menu command is incomplete.  The command now°dONLNdŒÅJçú(©hGdisplays a warning if the program counter points to a LINK instruction.
  711. °dONLNdõ<°A(øZn
  712. °dONLNdóJ£_)The 
  713. °dONLNdó_£É)Disasm
  714. °dONLNd"óÉ£¡)$? command correlates source statement numbers with assembly code°dONLNdb•J±⁄(ÕhSinstructions. Branch instructions which use the new branch island option, are shown°dONLNd∂≥Jø*-with a ^ character to denote the indirection.
  715. °dONLNd‰Õ<”A(ÒZn
  716. °dONLNdÊ…J’⁄)TThe intentional bug introduced in the third C tutorial program, Sample2, can be more°dONLNd;◊J„‹*Rdestructive than we intended. Running this program can cause your machine to hang.°dONLNdèÛJˇ›*UIf it does not hang your system, and you display the stack when the bus error occurs,°dONLNdÂJ
  717. Ê*Rthe output is more informative than documented, in that SADE displays some MacsBug°dONLNd8Jv*symbols.
  718. °dONLNdA)</A(MZn
  719. °dONLNdC%J1‰)USADE acquired the ability to prompt for source files when needed after the manual was°dONLNdô3J?–*Nfinalized.  As a consequence you may never have to use the SourcePath command.°dONLNdÈAJMÁ*VThis behavior is not documented in the SADE manual, but is described in some detail at°dONLNd    @OJ[ı*%the beginning of these release notes.(·Z
  720. SADE 1.3.3)Ã13)gE.T.O. #14 Release Notesˇx◊#ˇ ˇˇˇˇ#◊ 
  721. _,
  722.  
  723. Zapf Dingbats
  724. .°dONLNd5<;A+ZYn,Times
  725. °dONLNd1J=”)OSADE now includes an optional menu called Extras which is not documented in the°dONLNdR?JKG*8manual, but is described earlier in these release notes.°dONLNdçUJa‚*NContrary to what the SADE 1.3 Manual states, you can debug Hypercard XCMDs and°dONLNd‹cJo‹*SXFCNs with SADE. The procedure for doing this is described earlier in these release°dONLNd0qJ}g*notes.(·Z
  726. SADE 1.3.3)Ã14)gE.T.O. #14 Release Notesˇ